<?php
/**
 * Created by PhpStorm.
 * User: Haima
 * Date: 2018/7/12
 * Time: 3:11
 */

namespace app\lib\exception;
use Exception;
use think\exception\Handle;
use think\Log;
use think\Request;

class ExceptionHandler extends Handle
{
    private $code;
    private $msg;
    private $errorCode;

    public function render(Exception $e)
    {
        if($e instanceof BaseException){
            //如果是自定义异常，则控制http状态码，不需要记录日志
            //因为这些通常是因为客户端传递参数错误或者是用户请求造成的异常
            //不应当记录日志
            //这里取的是当前抛出异常的控制器里定义的异常信息
            $this->code = $e->code;
            $this->msg = $e->msg;
            $this->errorCode = $e->errorCode;
        }
        else{
            // 如果是服务器未处理的异常，将http状态码设置为500，并记录日志
            //Config::get('app_debug'); //获取config.php里的配置信息
            if (config('app_debug')){  //获取config.php里的配置信息如果是true走这里
                // 如果是前台调适人员看就显示json格式错误
                // 调试状态下需要显示TP默认的异常页面，因为TP的默认就是页面
                // 很容易看出问题
                return parent::render($e); //调用thinkphp5默认的报错页面
            }
            //如果是后台调适人员看就显示json格式错误
            $this->code = 500;
            $this->msg = '服务器错误,不想给你看';
            $this->errorCode = 999;
            $this->recordErrorLog($e);  //调用服务器异常错误
        }
        $request = Request::instance();
        $result = array(
            'msg'  => $this->msg,
            'error_code' => $this->errorCode,
            'request_url'  => $request->url()
        );
        return json($result,$this->code);
    }

    //服务器异常错误
    private function recordErrorLog(Exception $e){
        Log::init([
            'type'=>'File', //生成的类型是文件
            'path'=>LOG_PATH, //日志生成的路径
            'level'=>['error'] // 日志记录级别，使用数组表示
        ]);
        Log::record($e->getMessage(),'error');  //写入日志
    }
}